package com.terran4j.kotlin.basic

// Kotlin 中，用 var 定义一个可变变量，
//  用 val  定义一个不可变变量。
fun varAndVal() {
    var n = 1
    val m = 2
}

// 那 Kotlin 为什么要定义  var / val 呢？
// 停 3 秒

// 学过 java 的同学都知道，java 中并没有 var / val 关键字，
// 而是需要声明变量的类型，如：
//  int n = 1
// 这就产生一个问题，每定义一个变量，都得先写它的类型，需要多鼓几个字符的代码，
// 由于变量定义是非常常见的事，积累下来也是不小的浪费。

// 而 Kotlin 用 var / val  来声明变量，
// 并且它的编译器能根据 = 号的右边智能的推断出这个变量的类型，
// 因此可以省略对变量类型的定义，这样就可以帮助我们少写代码了。

// Kotlin 就是从这每一点每一滴的细节上进行优化，从帮助程序员们提高开发效率，
// 这也反映出 Kotlin 的设计者们，精益求精的精神。

// 当然，你写也行，比如这样：
fun smartDefine() {
    var n: Int = 10 // :Int 可以省略。
}
// 这里 IDEA 会智能的给出提示，告诉你这里类型的定义是没必要的，
// 我们可以在 IDEA 的提示下，去掉这个类型的定义。


// 我再来看下 val  的用法，它定义的是不可变变量，是不能改的，
fun defineVar2() {
    val b = 20   // 定义不可变变量
    // b = 21    // 编译不通过
    println("b = $b")
}

// 那问题来了： 理论上讲， var 定义可变变量就可以解决编程中的问题了啊，
// 为什么还要有 val 呢？

// 因为一门编程语言在设计时，会尽量的减少程序员犯错。
// 如果一个变量从业务意义上讲，它的值不能被改，那把它定义成不可变变量。
// 就不用担心后面被哪个粗心的程序员不小心改动了，
// 另外，由于编译器知道这个变量是不可变的，会有一些编译优化的措施，
// 可以在运行期间尽量的节省内存开销。



